/*
 * Copyright 2003-2006 (c) Live Media Pty Ltd. <argot@einet.com.au> 
 *
 * This software is licensed under the Argot Public License 
 * which may be found in the file LICENSE distributed 
 * with this software.
 *
 * More information about this license can be found at
 * http://www.einet.com.au/License
 * 
 * The Developer of this software is Live Media Pty Ltd,
 * PO Box 4591, Melbourne 3001, Australia.  The license is subject 
 * to the law of Victoria, Australia, and subject to exclusive 
 * jurisdiction of the Victorian courts.
 */

%fix_naming_to(type_stack, TypeStack);
%fix_naming_to(type_item, TypeItem);
%fix_naming_to(type_list, TypeList);


%ignore type_list_add_head;
%ignore type_list_remove_head;
%ignore type_list_clear;
%ignore type_stack_clear;


// the next part was stolen from Swig's own stdint.i

%{
#include <argot_stdint.h>		// Use the C99 official header
%}

%include <swigarch.i>

/* Exact integral types.  */

/* Signed.  */

typedef signed char		int8_t;
typedef short int		int16_t;
typedef int			int32_t;
#if defined(SWIGWORDSIZE64)
typedef long int		int64_t;
#else
typedef long long int		int64_t;
#endif

/* Unsigned.  */
typedef unsigned char		uint8_t;
typedef unsigned short int	uint16_t;
typedef unsigned int		uint32_t;
#if defined(SWIGWORDSIZE64)
typedef unsigned long int	uint64_t;
#else
typedef unsigned long long int	uint64_t;
#endif


/* Small types.  */

/* Signed.  */
typedef signed char		int_least8_t;
typedef short int		int_least16_t;
typedef int			int_least32_t;
#if defined(SWIGWORDSIZE64)
typedef long int		int_least64_t;
#else
typedef long long int		int_least64_t;
#endif

/* Unsigned.  */
typedef unsigned char		uint_least8_t;
typedef unsigned short int	uint_least16_t;
typedef unsigned int		uint_least32_t;
#if defined(SWIGWORDSIZE64)
typedef unsigned long int	uint_least64_t;
#else
typedef unsigned long long int	uint_least64_t;
#endif


/* Fast types.  */

/* Signed.  */
typedef signed char		int_fast8_t;
#if defined(SWIGWORDSIZE64)
typedef long int		int_fast16_t;
typedef long int		int_fast32_t;
typedef long int		int_fast64_t;
#else
typedef int			int_fast16_t;
typedef int			int_fast32_t;
typedef long long int		int_fast64_t;
#endif

/* Unsigned.  */
typedef unsigned char		uint_fast8_t;
#if defined(SWIGWORDSIZE64)
typedef unsigned long int	uint_fast16_t;
typedef unsigned long int	uint_fast32_t;
typedef unsigned long int	uint_fast64_t;
#else
typedef unsigned int		uint_fast16_t;
typedef unsigned int		uint_fast32_t;
typedef unsigned long long int	uint_fast64_t;
#endif


/* Types for `void *' pointers.  */
#if defined(SWIGWORDSIZE64)
typedef long int		intptr_t;
typedef unsigned long int	uintptr_t;
#else
typedef int			intptr_t;
typedef unsigned int		uintptr_t;
#endif


/* Largest integral types.  */
#if defined(SWIGWORDSIZE64)
typedef long int		intmax_t;
typedef unsigned long int	uintmax_t;
#else
typedef long long int		intmax_t;
typedef unsigned long long int	uintmax_t;
#endif



%include "util/typestack.h"


%set_constructor_0(type_list, type_list_init);
%set_constructor_0(type_stack, type_stack_init);


%define %addGetSet(typename, valuetype)

	%extend type_stack
	{	
		void set_##typename##_( type_element* t, valuetype value )
		{
			type_stack_set_##typename( self, t, value );
		}

		valuetype get_##typename##_()
		{
			return type_stack_get_##typename( self );
		}
	}

	%add_readonly_prop( type_stack, valuetype, typename, type_stack_get_##typename##_);

%enddef



%extend type_stack
{	
	int get_size_()
	{
		return type_stack_size( self );
	}

	type_element* get_type_()
	{
		return type_stack_type( self );
	}

	bool is_empty_()
	{
		return type_stack_is_empty( self );
	}
	
	type_list* get_list_()
	{
		return type_stack_get_list( self );
	}	
}

%addGetSet(u8, uint8_t);
%addGetSet(s8, int8_t);

%addGetSet(u16, uint16_t);
%addGetSet(s16, int16_t);

%addGetSet(u32, uint32_t);
%addGetSet(s32, int32_t);

%addGetSet(u64, uint64_t);
%addGetSet(s64, int64_t);

%addGetSet(ptr, void*);
%addGetSet(ptr, void*);

%add_readonly_prop( type_stack, int, size, type_stack_get_size_ );
%add_readonly_prop( type_stack, type_element*, type, type_stack_get_type_ );
%add_readonly_prop( type_stack, bool, empty, type_stack_is_empty_ );
%add_readonly_prop( type_stack, type_list*, list, type_stack_get_list_ );

%to_string_to_void_code